[IA64] MCA support - fix timer issue, log size issue, and limit logs to dom0
authorawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Wed, 15 Nov 2006 18:34:31 +0000 (11:34 -0700)
committerawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Wed, 15 Nov 2006 18:34:31 +0000 (11:34 -0700)
Signed-off-by: Yutaka Ezaki <yutaka.ezaki@jp.fujitsu.com>
Signed-off-by: Masaki Kanno <kanno.masaki@jp.fujitsu.com>
Signed-off-by: Kazuhiro Suzuki <kaz@jp.fujitsu.com>
linux-2.6-xen-sparse/include/asm-ia64/sal.h
xen/arch/ia64/linux-xen/mca.c
xen/arch/ia64/xen/fw_emul.c

index 0cda1c410bf61608d7fb23be67906c713986e84e..9439b49d8bbd86b44ba9abcceaa218f2bf4658f4 100644 (file)
@@ -699,16 +699,16 @@ ia64_sal_get_state_info (u64 sal_info_type, u64 *sal_info)
        struct ia64_sal_retval isrv;
 #ifdef CONFIG_XEN
        if (is_running_on_xen()) {
-               struct xencomm_mini xc_area[2];
-               int nbr_area = 2;
                struct xencomm_handle *desc;
 
-               if (xencomm_create_mini(xc_area, &nbr_area, sal_info,
-                          ia64_sal_get_state_info_size(sal_info_type), &desc))
+               if (xencomm_create(sal_info,
+                                  ia64_sal_get_state_info_size(sal_info_type),
+                                  &desc, GFP_KERNEL))
                        return 0;
 
                SAL_CALL_REENTRANT(isrv, SAL_GET_STATE_INFO, sal_info_type, 0,
                                   desc, 0, 0, 0, 0);
+               xencomm_free(desc);
        } else
 #endif
        SAL_CALL_REENTRANT(isrv, SAL_GET_STATE_INFO, sal_info_type, 0,
index 261e7a01748e21745b92cae06b767e4b429683e0..2d221cd7f9132270a68d482e894a8dcbc93ca337 100644 (file)
@@ -118,6 +118,12 @@ extern void setup_vector (unsigned int vec, struct irqaction *action);
 
 static ia64_mc_info_t          ia64_mc_info;
 
+#ifdef XEN
+#define jiffies                        NOW()
+#undef HZ
+#define HZ                     1000000000UL
+#endif
+
 #define MAX_CPE_POLL_INTERVAL (15*60*HZ) /* 15 minutes */
 #define MIN_CPE_POLL_INTERVAL (2*60*HZ)  /* 2 minutes */
 #define CMC_POLL_INTERVAL     (1*60*HZ)  /* 1 minute */
@@ -1388,7 +1394,11 @@ static irqreturn_t
 ia64_mca_cpe_int_caller(int cpe_irq, void *arg, struct pt_regs *ptregs)
 {
        static int start_count = -1;
+#ifdef XEN
+       static unsigned long poll_time = MIN_CPE_POLL_INTERVAL;
+#else
        static int poll_time = MIN_CPE_POLL_INTERVAL;
+#endif
        unsigned int cpuid;
 
        cpuid = smp_processor_id();
index ff024147a8d7d179172c88f4a2659aaebd1aff6f..6a37f051c4686344a677f956cbb0ef4cdcffa7a2 100644 (file)
@@ -205,7 +205,7 @@ sal_emulator (long index, unsigned long in1, unsigned long in2,
                }
                break;
            case SAL_GET_STATE_INFO:
-               {
+               if (current->domain == dom0) {
                        sal_queue_entry_t *e;
                        unsigned long flags;
                        struct smp_call_args_t arg;
@@ -274,13 +274,16 @@ sal_emulator (long index, unsigned long in1, unsigned long in2,
                                spin_unlock_irqrestore(&sal_queue_lock, flags);
                                xfree(e);
                        }
+               } else {
+                       status = IA64_SAL_NO_INFORMATION_AVAILABLE;
+                       r9 = 0;
                }
                break;
            case SAL_GET_STATE_INFO_SIZE:
                r9 = ia64_sal_get_state_info_size(in1);
                break;
            case SAL_CLEAR_STATE_INFO:
-               {
+               if (current->domain == dom0) {
                        sal_queue_entry_t *e;
                        unsigned long flags;
                        struct smp_call_args_t arg;